/*****************************************************************************
 *                     Projet de HCR : Annuaire distribué                    *
 *                      Guillaume MONTAVON (Master 2 RIM)                    *
 *                                                                           *
 *            Classe principale qui démarre le serveur d'annuaire            *
 *     Elle lance un Thread RepBroadcastThread qui s'occupe de renvoyer au   *
 *        client un message pour qu'il connaisse l'adresse IP du serveur     *
 *                Dès qu'un client se connecte on lance un                   *
 *             Thread ClientThread qui s'occupera de celui-ci                *
 *****************************************************************************/

import java.io.*;
import java.net.*;
import java.util.*;

public class Serveur {
	
	private int port = 22020;
	private ServerSocket ss;
	private Annuaire annuaire;
	private List<ClientThread> listeClient;
	private int numCourant;
	
	public Serveur(boolean local) {
		
		new RepBroadcastThread(port).start();
		
		annuaire = new Annuaire();
		listeClient = new ArrayList<ClientThread>();
		numCourant = 1;
		
		System.out.println("#######################################################");
		System.out.println("################# Démarrage du serveur ################");
		System.out.println("#######################################################");		
		
		try {
			
			if(!local)
				ss = new ServerSocket(port);
			
			while (true) {// attente en boucle de connexion (bloquant sur ss.accept)
			
				if(local)
					ss = new ServerSocket(port + numCourant); //modifié
			
				System.out.println("Attente d'une connexion d'un client ........");
				listeClient.add(new ClientThread(ss.accept(), numCourant, this));
				listeClient.get(listeClient.size()-1).start(); // un client se connecte, un nouveau thread client est lancé
				numCourant++;
			}
		
		} catch(Exception e) {
			System.out.println(e);
		}
		
	}
	
	public Annuaire getAnnuaire() {
		return annuaire;
	}
	
	public void supprimerClient(ClientThread client) {
		System.out.println ("Déconnexion d'un client (" + client.getAdresse() + ")");
		annuaire.afficher();
		listeClient.remove(client);
	}
	
	public void ajouterNom(String nom, String adresseIP) {
		System.out.println ("######### Ajout de " + nom + " dans ma base de données #########\n");
		annuaire.enregistrementAnnuaire(nom, adresseIP);
	}
	
	public void supprimerNom(String nom) {
		annuaire.suppressionAnnuaire(nom);
	}
	
	public static void main(String[] args) {
		
		if(args.length > 0 && args[0].equals("local"))
			new Serveur(true);
		else
			new Serveur(false);
		
	}

}
